#!/bin/bash
set -euo pipefail

# 配置信息
SOURCE_REGISTRY="easzlab.io.local:5000"       # 源仓库（含端口）
TARGET_REGISTRY="registry.cic.cmbchina.cn/ks"  # 目标仓库
SOURCE_USER="admin"
SOURCE_PASS="password"
TARGET_USER="XXX"  # 替换为目标仓库用户名
TARGET_PASS="XXX"  # 替换为目标仓库密码

# 临时镜像列表
IMAGE_LIST=$(mktemp)
trap "rm -f $IMAGE_LIST" EXIT


# 1. 登录仓库
echo "=== 登录源仓库 $SOURCE_REGISTRY ==="
docker login "$SOURCE_REGISTRY" -u "$SOURCE_USER" -p "$SOURCE_PASS" || exit 1

echo -e "\n=== 登录目标仓库 $TARGET_REGISTRY ==="
docker login "$TARGET_REGISTRY" -u "$TARGET_USER" -p "$TARGET_PASS" || exit 1


# 2. 获取源仓库所有镜像
echo -e "\n=== 获取镜像列表 ==="
REPOSITORIES=$(curl -s -u "${SOURCE_USER}:${SOURCE_PASS}" \
  "http://${SOURCE_REGISTRY}/v2/_catalog" | jq -r '.repositories[]')

[ -z "$REPOSITORIES" ] && { echo "无镜像可同步"; exit 1; }

# 生成完整镜像名（源仓库/路径:标签）
for repo in $REPOSITORIES; do
  TAGS=$(curl -s -u "${SOURCE_USER}:${SOURCE_PASS}" \
    "http://${SOURCE_REGISTRY}/v2/${repo}/tags/list" | jq -r '.tags[]?')
  for tag in $TAGS; do
    echo "${SOURCE_REGISTRY}/${repo}:${tag}" >> "$IMAGE_LIST"
  done
done

echo "共发现 $(wc -l < "$IMAGE_LIST") 个镜像待同步"


# 3. 同步镜像（核心：用最后一个冒号分割标签）
echo -e "\n=== 开始同步 ==="
while read -r image; do
  # 示例image：easzlab.io.local:5000/openebs/kubectl:1.25.15
  # 步骤1：用最后一个冒号分割，提取【源仓库+路径】和【标签】
  # 最后一个冒号前的部分：easzlab.io.local:5000/openebs/kubectl
  source_full=$(echo "$image" | sed 's/:[^:]*$//')  # 关键修正：保留最后一个冒号前的所有内容
  # 最后一个冒号后的部分：1.25.15（标签）
  tag_part=$(echo "$image" | sed 's/.*://')          # 关键修正：只取最后一个冒号后的标签

  # 步骤2：分离源仓库域名和路径（用第一个/分割）
  # 源仓库域名：easzlab.io.local:5000
  source_registry=$(echo "$source_full" | cut -d'/' -f1)
  # 源路径（去除域名后的部分）：openebs/kubectl
  source_path=$(echo "$source_full" | cut -d'/' -f2-)

  # 步骤3：构建目标镜像（目标仓库 + 源路径 + 标签）
  target_image="${TARGET_REGISTRY}/${source_path}:${tag_part}"

  # 输出信息
  echo -e "\n--- 处理镜像 ---"
  echo "源镜像: $image"
  echo "目标镜像: $target_image"

  # 同步操作
  if docker pull "$image"; then
    docker tag "$image" "$target_image" || {
      echo "❌ 打标签失败"
      continue
    }
    if docker push "$target_image"; then
      echo "✅ 推送成功"
      docker rmi "$image" "$target_image" >/dev/null 2>&1 || true  # 清理本地镜像
    else
      echo "❌ 推送失败"
    fi
  else
    echo "❌ 拉取失败"
  fi
done < "$IMAGE_LIST"


echo -e "\n=== 同步完成 ==="